home *** CD-ROM | disk | FTP | other *** search
- #ifndef __METAINFO__
- #define __METAINFO__
-
- #include <stddef.h>
-
- #include <Types.h>
-
- class MetaInfo {
-
- static int sNumClasses;
- static MetaInfo * g_head_info;
- MetaInfo *next;
-
- MetaInfo *ancestor1;
- MetaInfo *ancestor2;
- MetaInfo *ancestor3;
- MetaInfo *ancestor4;
- void *(*new_func)(void);
-
- public :
-
- const char *name;
- size_t size;
-
- MetaInfo (const char *nam, size_t siz, void*(*new_fun)(void),
- MetaInfo *ancesto1 = NULL, MetaInfo *ancesto2 = NULL,
- MetaInfo *ancesto3 = NULL, MetaInfo *ancesto4 = NULL)
- {
- name = nam; size = siz; new_func = new_fun; ancestor1 = ancesto1;
- ancestor2 = ancesto2; ancestor3 = ancesto3; ancestor4 = ancesto4;
- next = g_head_info; g_head_info = this;
- sNumClasses++;
- }
-
- static void *NewByName(const char *str);
-
- static Boolean Member(MetaInfo *o, MetaInfo *c);
-
- static Boolean ClassExists(const char *name);
- };
-
-
- #define class_name(o) ((o)->_getClassInfo()->name)
-
- #define member(o,c) (MetaInfo::Member((o)->_getClassInfo(), &c::_classInfo))
-
- #define new_by_name(n) (MetaInfo::NewByName(n))
-
- #define class_exists(c) (MetaInfo::ClassExists(c))
-
- #define TCL_DECLARE_CLASS \
- public : \
- static MetaInfo _classInfo ; \
- virtual MetaInfo * _getClassInfo ( ) ; \
- static void * _new ( void ) ; \
- private :
-
-
- #define TCL_DEFINE_CLASS(c) \
- MetaInfo * c :: _getClassInfo ( void ) { return & c :: _classInfo ; } \
- void * c :: _new ( void ) { return new c ( ) ; }
-
-
- #define TCL_DEFINE_CLASS_D0(c) \
- TCL_DEFINE_CLASS(c) \
- MetaInfo c :: _classInfo ( #c , sizeof ( c ) , c :: _new )
-
-
- #define TCL_DEFINE_CLASS_D1(c,a) \
- TCL_DEFINE_CLASS(c) \
- extern MetaInfo a :: _classInfo ; \
- MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
- & a :: _classInfo )
-
-
- #define TCL_DEFINE_CLASS_D2(c,a1,a2) \
- TCL_DEFINE_CLASS(c) \
- extern MetaInfo a1 :: _classInfo ; \
- extern MetaInfo a2 :: _classInfo ; \
- MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
- & a1 :: _classInfo , & a2 :: _classInfo )
-
-
- #define TCL_DEFINE_CLASS_D3(c,a1,a2,a3) \
- TCL_DEFINE_CLASS(c) \
- extern MetaInfo a1 :: _classInfo ; \
- extern MetaInfo a2 :: _classInfo ; \
- extern MetaInfo a3 :: _classInfo ; \
- MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
- & a1 :: _classInfo , & a2 :: _classInfo , \
- & a3 :: _classInfo )
-
-
- #define TCL_DEFINE_CLASS_D4(c,a1,a2,a3,a4) \
- TCL_DEFINE_CLASS(c) \
- extern MetaInfo a1 :: _classInfo ; \
- extern MetaInfo a2 :: _classInfo ; \
- extern MetaInfo a3 :: _classInfo ; \
- extern MetaInfo a4 :: _classInfo ; \
- MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
- & a1 :: _classInfo , & a2 :: _classInfo , \
- & a3 :: _classInfo , & a4 :: _classInfo )
-
- #endif /* __METAINFO__ */
-
-